﻿(function(X, $){

var ui = X.ui;
var FALSE = false;
var TRUE  = true;
var Util  = X.util;
var doc = document;
var Req = X.request;

/**
 * @class Xwb.ui.MgrDlg
 * 本类是Xwb后台浮层管理类，可控制浮层显示、验证、提交等复杂动作。
 * @param {Object} config  该配置信息将被完全地复制到当前实例中，并会覆盖相同属性名的默认值。
 * */

/**
 * @cfg {Object} dlgcfg
 * 对本控件显示模块的配置{@link #dlg}
**/

/**
 * @cfg {Object} valcfg
 * 对本控件验证模块的配置{@link #valObj}
**/

/**
 * @cfg {String} modeHtml
 * 显示的内容模版,该属性直接赋值显示实例的contentHtml属性
**/

/**
 * @cfg {String} modeUrl
 * 显示的内容模版,该属性直接赋值显示实例的contentHtml属性,配置该属性可以动态的请求内容模版
**/

/**
 * @cfg {String} url
 * 显示框的提交地址 异步模式和表单模式都适用
**/

/**
 * @cfg {Function} convertData
 * 数据转换,如果ajax请求有特殊的数据处理要求我们可以用这个函数来处理，
 * 函数参数data:验证器提供的表单键值对，我们需返回用于ajax的数据
**/

/**
 * @cfg {Object} ajaxcfg
 * 异步模式下异步提交数据的特殊配置
 **/

/**
 * @cfg {Function} success
 * 异步模式下验证通过jQuery的回调函数 函数参数 rst:jQuery回调函数参数，dlg:本控件的{@link #dlg}实例。  
 * 函数如果返回值不为false 显示控件会关闭
 * */

/**
 * @cfg {Function} actiontrig
 * 本控件默认开启 rel 事件监听，
 * 该函数可处理rel事件，
 * 函数的参数e:是 {@link Xwb.ax.ActionEvent} 实例
 * */

/**
 * @cfg {Function} afterDisplay 
 * 控件所有初始化完成后调用的函数
 * */

/**
 * @cfg {Boolean} formMode 
 * 设置控件运行模式，true为表单提交模式 默认是异步提交模式
 * */

/**
 * @cfg {Function} selfChk 
 * 在表单特殊的验证要求,当验证器通过以后运行。返回false终止提交过程
 * */
 
 /**
 * @property dlg
 * 控件的 Xwb.ui.Dialog 实例 用于显示
 * @type Xwb.ui.Dialog
 */
 /**
 * @property valObj
 * 本控件的 Xwb.ax.ValidationMgr 实例 用于验证
 * @type Xwb.ax.ValidationMgr
 */


ui.MgrDlg=X.reg('MgrDlg',Util.create());

ui.MgrDlg.prototype={
		// dlg:NULL,//Dlg对象
		
		// valObj:NULL,//验证器对象
		
		init:function(config){
			$.extend(this,config);
			//构建Dlg并附加没有的必要参数
			var self=this;
			this.dlg=X.use('Dlg',$.extend({},{
                mask : FALSE,
                appendTo:doc.body,
                cs: 'win-pub win-fixed '+(config.extcs || ''),
                actionMgr:true,
                closeable:true,
                mask:true,
				isFixed:true,
                onactiontrig:function(e){
                	switch (e.get('e')){
                	 case 'cal':this.close();break;
                	}
                	self.actiontrig && self.actiontrig(e); 
                }
			},this.dlgcfg));
			//在验证器上附加formSuccess函数
			$.extend(this.valcfg,{onsuccess:Util.bind(this.formSuccess,this)});
			this.dlg && this.loadDlg();
		},
		
		afterDisplay:$.noop,
		
		//更具配置加载Dlg
		loadDlg:function(){
			var self=this;
			if(this.modeHtml){
				this.dlg.contentHtml=this.modeHtml;
				this.loaded();
			}
			else if(this.modeUrl){
				$.get(this.modeUrl,function(txt){
					self.dlg.contentHtml= typeof txt =='string' ? txt : txt.rst;
					self.loaded();
				});
				return;
			}
		},
		//加载完成之后
		loaded:function(){
			if( this.DlgIsLoad ) { this.dlg.jq('#xwb_dlg_ct').html(this.dlg.contentHtml); this.dlg.onViewReady(this.dlg.view); }
			this.dlg.display(true);
			this.dlgcfg && this.dlgcfg.width && this.dlg.jq().css('width',this.dlgcfg.width + 'px');
			//自动检测表单
			if( this.valcfg && this.valcfg.form == 'AUTO'){
				this.valcfg.form= "#" + this.dlg.jq("form").attr('id');
			}
			//加载验证器
			 this.valcfg && ( this.valObj=X.use('Validator',this.valcfg) );
			 if(this.formMode && this.formMode ===TRUE){
			 	this.url && (this.valObj.form.action=this.url);
			 } else {
			 	if( !this.url && this.valcfg ) this.url = this.valObj.form.action;
			 }
			 this.dlg.jq().css('marginLeft', 0);
			 this.dlg.center();
			 this.afterDisplay  && this.afterDisplay();
		},
/**
 * 用于动态内容模版的时候重新请求模版内容
 **/
		reload:function(){
			this.modeUrl && ( this.modeUrl = this.modeUrl+"&"+ Math.random() );
			this.loadDlg();
			this.DlgIsLoad=true;
		},
		//转换表单字段
		convertData:function(data){
			return data;
		},
		
		//提交返回
		success:$.noop,
		
		//验证成功
		formSuccess:function(data , next){
			var self=this;
			if(this.selfChk && this.selfChk(data) == FALSE) { next(); return FALSE; }
			if(this.formMode && this.formMode ===TRUE){
				next();
				if(this.valcfg.formLock) return false;
				this.valcfg.formLock = true;
				return true;
			}
			else{
				var ajaxobj=$.extend({
					url:this.url,
					data:this.convertData(data),
					success:function(ret){
						if(self.success(ret,self.dlg) !== FALSE){
							self.dlg.close();
						}
						next();//表单成功返回解锁表单
					}
				},this.ajaxcfg);			
				$.ajax(ajaxobj);
			}
			return false;
		}
};


X.reg('addMaja', function(gid){
    Xwb.use('MgrDlg', {
        modeUrl: Req.mkUrl('admin/youji','majaPop','gid='+gid),
		formMode: false,
        dlgcfg: {
            title: '添加马甲',
			actionMgr: true,
			onactiontrig: function(e){
			    var v = this.jq("#majaName").val();
				    $mList = this.jq("#majaList");
			    switch(e.data.e){
				    case 'add':
					    if( v != ''){
						    for(var i=0, lis=$mList.children('li'),o;o=lis[i];i++){
							    if( $(o).text() == $.trim(v) ){
							       return Xwb.ui.MsgBox.error('提示','该马甲已添加'); 
								}
							}
						    Req.postReq(Req.mkUrl('admin/jsApi','addMaja','gid='+gid),'name='+v,function(e){
								if(e.isOk())
								    $mList.append($('<li><input type="checkbox" class="checkbox" name="id[]" value="'+e.getData()+'" />'+ v +'</li>'));
							    else Xwb.ui.MsgBox.error('提示',e.getError() || '添加失败');
							});
						}
					    break;
					case 'up':
					    var $cks = $mList.find("input:checkbox"), 
						    $cked = $mList.find("input:checked:eq(0)");
						if( !$cked[0] || $cks[0] == $cked[0] )
						    return ;
						var $li = $cked.parent('li');
							$li.insertBefore($li.prev('li'));
					    break;
					case 'down':
						var $cks = $mList.find("input:checkbox"), 
						    len = $cks.length,
						    $cked = $mList.find("input:checked:eq(0)");
						if( !$cked[0] || $cks[len-1] == $cked[0] )
						    return ;
						var $li = $cked.parent('li');
						$li.insertAfter($li.next('li'));
					    break;
					case 'del':
					    var $ck = $mList.find("input:checked:eq(0)") 
						if($ck.length){
						    Req.postReq(Req.mkUrl('admin/jsApi','delMaja','gid='+gid),'id='+$ck.val(),function(e){
								if(e.isOk())
								    $ck.parent().remove();
							    else Xwb.ui.MsgBox.error('提示',e.getError() || '删除失败');
							})
						}
					    break;
					default:
					    return;
				}
			},
			destroyOnClose: true,
            onViewReady: function(View){
                var self = this,
				    $view = $(View);
                $view.find('#pop_ok').click(function(){
				    var sort = [];
					$view.find("input:checkbox").each(function(i, o){
						sort.push( o.value );
					})
                    Req.postReq(Req.mkUrl('admin/jsApi','saveMaja','type=sort&gid='+gid),'ids='+sort.join(','),function(e){
						if(e.isOk()){
							self.close(1);
							if(gid==2){location.reload();}
						}
						else Xwb.ui.MsgBox.error('提示',e.getError());
					});
                });
				$view.find('#pop_cancel').click(function(){ self.close(1); if(gid==2){location.reload();} });
				
				$view.delegate('input:checkbox','click',function(e){
					var $t = $(this), 
					    state = !!$t.attr('checked');
				    if( state == true ){
					    $view.find("input:checked").each(function(i,o){
						    $(o).attr('checked',false);
						});
						$t.attr('checked', true);
					}
				})
            }
        }
    });
});

X.reg('AutoComplate', Util.create(ui.Layer, function(proto){
    return {        
		view : "autoComplate",
		$table : null,       //view里面包含的表格对象，方便一些操作
        relateInp : null,    //关联的 输入框 和 按钮
		hdRelateInp : null,
		
		viewWidth : 0,   //自身宽度
		reInpWidth : 0,
		reInpHeight : 0,

        appendTo : "body",

		onEnter : function(){
		    var str = this.$table.find("tr.selected");
			if(str.length){
				this.relateInp.value = str.attr("rel").match(/id:\w+/)[0].substring(3);
				this.inView = false;
				this.display(false);
			}
		},

        hidden : true,
		autoRender : true,

		actionMgr : true,
		onactiontrig : function(act){
		    switch(act.data.e){
                case 'se' :
					var id = act.get("id");
					if(id && id != "") {
					   $(this.relateInp).val(act.src.innerHTML);
					   $(this.hdRelateInp).val(id);
					}
					this.display(false);
                    break;
                default : return ;
            }
		},
		init : function(){
            proto.init.apply(this, arguments);
        },
		
		inView : false,
        onViewReady : function(){
            proto.onViewReady.call(this);
			var self = this, $inp = $(self.relateInp);
			if(self.relateInp){
				$(self.view).hover(function(){ self.inView = true; } , function(){ self.inView = false; });
			    $inp.focus(function(){
				    $.trim($inp.val()) !== "" ? self.display(true) : self.inView = false;
				}).click(function(){
					if( $.trim($inp.val()) === "" ){
					    self.display(false);
					    return false;
					}
					self.inView = false;
					self.display(true);
				})
				if(this.relateInpBlur){
				    $inp.blur(function(){ 
					    self.relateInpBlur();    //添加额外的失去焦点时的处理函数
						self.display(self.inView);
						return true;
					});
				}
				else $inp.blur( function(){self.display(self.inView);} ); //默认失去焦点时，只隐藏自己

				$inp.keyup(function(e){
				    switch(e.keyCode){
						case 13 :
                            self.onEnter.call(self);
					        return ;
				    }
					var v = $.trim($inp.val());
					if( v === ""){
					    self.display(false);
					    return false;
					}
					self.display(true);
				    self.readyToSent(v);
			    })
				self.$ul = $(self.view).find("ul");
			}
        },
		
		display : function(b){
		    if(b){
				var $v = this.jq();
                if(this.resetPos){
				    $v.css({"postion":"absolute", "left": this.resetPos.left, "top": this.resetPos.top} );				
		        }
				else {
					var inpPos = $(this.relateInp).offset();
					if(inpPos.left + this.viewWidth < document.body.clientWidth)
					    $v.css({"postion":"absolute", "left": inpPos.left, "top": inpPos.top + this.inpHeight} );
				    else 
					    $v.css({"postion":"absolute", "left": inpPos.left - this.viewWidth + this.reInpWidth, "top": inpPos.top + this.inpHeight} );
				}
			}
			proto.display.call(this,b);
		},
		timer : null,
		cache : {},
		readyToSent : function(key){
		    var self = this,
				tparse = X.ax.Tpl.parse;
		    if(key !== "" ){
			    self.$ul.html( '' );
				if(self.cache[key]){
				    self.parseData( self.cache[key] );  //已有缓存，则模拟回调
				}
				else {
					clearTimeout(self.timer);
					self.timer = setTimeout( 
					(function(k){
					    return function(){ 
					    	Req.postReq(Req.mkUrl("admin/jsApi","getSpotByLocation"),{"key": k}, function(e){
						    	if(e.isOk){
								    var data = e.getData();
									var cache_k = self.cache[k] = {}, count = 0;
									for(var c in data){
									    if( k == data[c].name ){   //如果相等则直接赋值
										    $(self.hdRelateInp).val(c);
										}
									    cache_k[c] = data[c];
										if( ++count >=10 ) break;  //只显示10个
									}
									self.parseData( cache_k );
								}
							})
						}
					})(key),
					200); //200ms的延时
				}
			}
		},
		parseData : function( obj ){ //obj = { 443323:{id:121,name:"xxx"},.... }
		    var lis = [];
			for(var c in obj){
			    var obj_c = obj[c];
			    lis.push('<li onmouseover="this.className=\'cur\'" onmouseout="this.className=\'\'" rel="e:se,id:'+ obj_c.id +'">'+obj_c.name +'</li>');
			}
			if( lis.length === 0 )
			    lis.push('<li>  找不到相关的景点数据……</li>');
			this.$ul.html(lis.join(''));
			this.display(1);
		}
    }
}));


/**
 * @class Xwb.mod.notice
 * 消息提示浮层
 * @extends Xwb.ui.Box
 * @singleton
 */
 
X.reg('adminNotice', function( cfg ){
	var Req = Xwb.request, cmmUrl = Req.mkUrl('admin/maja','majaMsg'), youjiUrl = Req.mkUrl('admin/youji','index'),
	clientUrl = Req.mkUrl('admin/izy/timeline','index'),
	cmmClient = Req.mkUrl('admin/majaClient','majaMsg'),
	topicUrl  = Req.mkUrl('admin/group','review'),
	cmmTopic  = Req.mkUrl('admin/maja','majaMsg','type=3');
	var box = X.use('Box', {
    	cs:'win-notice',	
		contentHtml : '<p id="cmm">你有<span id="n">0</span>条新评论/回复，<a href="'+cmmUrl+'" target="mainframe">点击查看</a></p>'+
					  '<p id="youji">会员发布了<span id="n">0</span>篇新游记，<a href="'+youjiUrl+'" target="mainframe">点击查看</a></p>'+
					  '<p id="client">你有<span id="n">0</span>条新微游，<a href="'+clientUrl+'" target="mainframe">点击查看</a></p>'+
					  '<p id="cmm_client">你有<span id="n">0</span>条客户端新评论，<a href="'+cmmClient+'" target="mainframe">点击查看</a></p>'+
					  '<p id="topic">你有<span id="n">0</span>篇新帖子，<a href="'+topicUrl+'" target="mainframe">点击查看</a></p>'+
					  '<p id="cmm_topic">你有<span id="n">0</span>条帖子评论，<a href="'+cmmTopic+'" target="mainframe">点击查看</a></p>',
        appendTo : document.body,
		msgUrl : Req.mkUrl('message'),
		youjiUrl : Req.mkUrl('message','dynamic',{org:1}),
		friFeedUrl : Req.mkUrl('message'),
        //closeable:true,
		notices : ['cmm', 'youji', 'client', 'cmm_client', 'topic', 'cmm_topic'],
		onViewReady : function(){
			var $v = $(this.view).find('#xwb_dlg_ct');
			var self = this;
			$v.find('p').click(function(e){
				$(this).cssDisplay(0);
				if($v.find('p:visible').length == 0)
					self.display(0);
			});
		},
		hidden : true,
		setNotice : function(lists){
			if(lists === 0){
				var ns = this.notices, lists = {};
				for(var i=0,j=ns.length;i<j;i++)
					lists[ns[i]] = 0;
			}
			var show = false;
			for(var k in lists){
				var v = Number(lists[k]), obj = this.jq('#'+k);
				if(obj.length == 0) continue;
 				obj.find('#n').text(v);
				if(v>0){
					show = true;
					if($.inArray(k,this.notices)) obj.cssDisplay(1);
				}else{
					obj.cssDisplay(0);
				} 
			}
			
			this.display(show);
			return show;
		},
		
		onClsBtnClick : function(e){
			e.preventDefault();
			ui.Base.prototype.onClsBtnClick.call(this);
			this.setNotice(0);
		},		
		
		unreadLoad : function(lists){
			var show = this.setNotice(lists);
		}
    }).display(0);
	X.reg('adminNotice', box, true);

	return box;
});

})(Xwb, $);